package com.coder.books.thinkinjava;

/**
 * 嵌套接口
 *
 * @author yuhushuan
 * @date 2020/7/24 23:21
 */
class A {
    interface B {
        void f();
    }

    public class BImp implements B {
        public void f() {
        }
    }

    private class BImp2 implements B {
        public void f() {
        }
    }

    public interface C {
        void f();
    }

    class CImp implements C {
        public void f() {
        }
    }

    private class CImp2 implements C {
        public void f() {
        }
    }

    private interface D {
        void f();
    }

    private class DImp implements D {
        public void f() {
        }
    }

    public class DImp2 implements D {
        public void f() {
        }
    }

    public D getD() {
        return new DImp2();
    }

    private D dRef;

    public void received(D d) {
        dRef = d;
        dRef.f();
    }

}

interface E {
    interface G {
        void f();
    }

    public interface H {
        void f();
    }

    void g();
}

public class NestingInterfaces {
    public class BImp implements A.B {

        public void f() {
        }
    }

    class CImp implements A.C {
        @Override
        public void f() {

        }
    }

//    class DImp implements A.D {
//        @Override
//        public void f() {
//
//        }
//    }

    class EImp2 implements E {
        @Override
        public void g() {
        }

        class EG implements G {
            @Override
            public void f() {

            }
        }
    }

    public static void main(String[] args) {
        A a = new A();

        // Can't access A.D:
//        A.D ad = a.getD();
        // Doesn't return anything but A.D:
//        A.DImp2 di2 = a.getD();
        // Cannot access a member of the interface:
//        a.getD().f();

        // Only another A can do anything with getD():
        A a2 = new A();
        a2.received(a.getD());
    }
}
